package negocio;

import datos.TipoObra;
import java.net.URL;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.PersistenceContext;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

/**
 *
 * @author Ing. Monica Merlo, Ing. Agustin  Fernandez
 */
@Stateless
public class GestorTipoObraBean implements GestorTipoObraRemote, GestorTipoObraLocal {

    static Logger logger = Logger.getLogger(GestorTipoObraBean.class);

    public static void log4j(Exception e) {
        URL url = GestorTipoObraBean.class.getResource("/configuracion/log4j.properties");
        PropertyConfigurator.configure(url);
        logger.error(e);
    }
    @PersistenceContext
    private EntityManager em;

    /***
     * Retorna todas laas instancias de TipoObra, almacenadas en la BD.
     * @return lista con todas las instancias de tipo obra almacenadas en la base
     * de datos y null en caso contrario
     * interfaz local
     */
    public List consultarTipoObra() {
        try {
            javax.persistence.Query q = em.createNamedQuery("TipoObra.findAll");
            return q.getResultList();

        } catch (Exception e) {
            GestorTipoObraBean.log4j(e);
            return null;
        }

    }

    /***
     * Retorna todas laas instancias de TipoObra, almacenadas en la BD.
     * @return lista con todas las instancias de tipo obra almacenadas en la base
     * de datos y null en caso contrario
     * interfaz remota
     */
    public List consultarTipoObraRemote() {
        try {
            javax.persistence.Query q = em.createNamedQuery("TipoObra.findAll");
            return q.getResultList();

        } catch (Exception e) {
            GestorTipoObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna aquella instancia de TipoObra cuyo nombre coincida con el parametro nombre.
     * @param nombre
     * @return instancia tipo obra con nombre igual a "nombre" y null en caso contrario
     * interfaz local
     */
    public TipoObra encontrarTipoObra(String nombre) {
        try {
            javax.persistence.Query q = em.createNamedQuery("TipoObra.findByNombre");
            q.setParameter("nombre", nombre);
            return (TipoObra) q.getSingleResult();

        } catch (Exception e) {
            GestorTipoObraBean.log4j(e);
            return null;
        }

    }

    /***
     * Retorna aquella instancia de TipoObra cuyo nombre coincida con el parametro nombre.
     * @param nombre
     * @return instancia tipo obra con nombre igual a "nombre" y null en caso contrario
     * interfaz remota
     */
    public TipoObra encontrarTipoObraRemote(String nombre) {
        try {
            javax.persistence.Query q = em.createNamedQuery("TipoObra.findByNombre");
            q.setParameter("nombre", nombre);
            return (TipoObra) q.getSingleResult();

        } catch (Exception e) {
            GestorTipoObraBean.log4j(e);
            return null;
        }

    }

    /***
     * Retorna todos los nombres de las instancias de TipoObra.
     * @return lista con todos los nombres de las instancias de tipoObra
     * y null en caso contrario
     * interfaz local
     */
    public List tiposObra() {
        try {
            javax.persistence.Query q = em.createNamedQuery("TipoObra.encontrarTodosNombre");
            return q.getResultList();

        } catch (Exception e) {
            GestorTipoObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna todos los nombres de las instancias de TipoObra.
     * @return lista con todos los nombres de las instancias de tipoObra
     * y null en caso contrario
     * interfaz remota
     */
    public List tiposObraRemote() {
        try {
            javax.persistence.Query q = em.createNamedQuery("TipoObra.encontrarTodosNombre");
            return q.getResultList();

        } catch (Exception e) {
            GestorTipoObraBean.log4j(e);
            return null;
        }
    }

    /***
     *
     * @param object
     */
    public void persist(Object object) {
        em.persist(object);
    }

    /***
     * Agrega una nueva instancia de TipoObra a la BD.
     * @param tipoObra
     * @return true si la instancia tipoObra ha sido persistida con exito
     * y false en caso contrario
     * interfaz local
     */
    public boolean agregarTipoObra(TipoObra tipoObra) {
        try {
            persist(tipoObra);
            return true;
        } catch (Exception e) {
            GestorTipoObraBean.log4j(e);
            return false;
        }
    }

    /***
     * Agrega una nueva instancia de TipoObra a la BD.
     * @param tipoObra
     * @return true si la instancia tipoObra ha sido persistida con exito
     * y false en caso contrario
     * interfaz remota
     */
    public boolean agregarTipoObraRemote(TipoObra tipoObra) {
        try {
            persist(tipoObra);
            return true;
        } catch (Exception e) {
            GestorTipoObraBean.log4j(e);
            return false;
        }

    }

    /***
     * Actualiza una instancia de TipoObra, previamente encontrada por su ID en la BD.
     * @param tipoObra
     * @return true si la instancia tipoObra es encontrada por su ID, modificados sus atributos
     * y persistida con exito. False en caso contrario
     * interfaz local
     */
    public boolean modificarTipoObra(TipoObra tipoObra) {
        try {
            TipoObra to = em.find(TipoObra.class, tipoObra.getId());
            to.setDescripcion(tipoObra.getDescripcion().toUpperCase());
            to.setNombre(tipoObra.getNombre().toUpperCase());
            persist(to);
            return true;
        } catch (Exception e) {
            GestorTipoObraBean.log4j(e);
            return false;
        }
    }

    /***
     * Actualiza una instancia de TipoObra, previamente encontrada por su ID en la BD.
     * @param tipoObra
     * @return true si la instancia tipoObra es encontrada por su ID, modificados sus atributos
     * y persistida con exito. False en caso contrario
     * interfaz remota
     */
    public boolean modificarTipoObraRemote(TipoObra tipoObra) {
        try {
            TipoObra to = em.find(TipoObra.class, tipoObra.getId());
            to.setDescripcion(tipoObra.getDescripcion().toUpperCase());
            to.setNombre(tipoObra.getNombre().toUpperCase());
            persist(to);
            return true;
        } catch (Exception e) {
            GestorTipoObraBean.log4j(e);
            return false;
        }
    }

    /***
     * Remueve una instancia de TipoObra, previamente encontrada por ID en la BD.
     * @param tipoObra
     * @return true si la instancia tipoObra es encontrada por su ID, y removida
     * de la base de datos con exito. False en caso contrario
     * interfaz local
     */
    public boolean eliminarTipoObra(TipoObra tipoObra) {
        try {
            TipoObra to = em.find(TipoObra.class, tipoObra.getId());
            em.remove(to);
            return true;
        } catch (Exception e) {
            GestorTipoObraBean.log4j(e);
            return false;
        }
    }

    /***
     * Remueve una instancia de TipoObra, previamente encontrada por ID en la BD.
     * @param tipoObra
     * @return true si la instancia tipoObra es encontrada por su ID, y removida
     * de la base de datos con exito. False en caso contrario
     * interfaz remota
     */
    public boolean eliminarTipoObraRemote(TipoObra tipoObra) {
        try {
            TipoObra to = em.find(TipoObra.class, tipoObra.getId());
            em.remove(to);
            return true;
        } catch (Exception e) {
            GestorTipoObraBean.log4j(e);
            return false;
        }
    }

    /***
     * Busca en la BD alguna instancia de TipoObra por nombre.
     * @param tipoObra
     * @return true si existe alguna instancia de tipoObra con nombre = "nombre"
     * y false en caso contrario
     * interfaz local
     */
    public boolean existeNombreTipoObra(TipoObra tipoObra) {
        try {
            javax.persistence.Query q = em.createNamedQuery("TipoObra.findByNombre");
            q.setParameter("nombre", tipoObra.getNombre().toUpperCase());
            if (q.getSingleResult() != null) {
                return true;
            } else {
                return false;
            }
        } catch (NoResultException ne) {
            GestorTipoObraBean.log4j(ne);
            return false;
        } catch (NonUniqueResultException nue) {
            GestorTipoObraBean.log4j(nue);
            return true;
        } catch (IllegalStateException ie) {
            GestorTipoObraBean.log4j(ie);
            return true;
        }

    }

    /***
     * Busca en la BD alguna instancia de TipoObra por nombre.
     * @param tipoObra
     * @return true si existe alguna instancia de tipoObra con nombre = "nombre"
     * y false en caso contrario
     * interfaz remota
     */
    public boolean existeNombreTipoObraRemote(TipoObra tipoObra) {
        try {
            javax.persistence.Query q = em.createNamedQuery("TipoObra.findByNombre");
            q.setParameter("nombre", tipoObra.getNombre().toUpperCase());
            if (q.getSingleResult() != null) {
                return true;
            } else {
                return false;
            }
        } catch (NoResultException ne) {
            GestorTipoObraBean.log4j(ne);
            return false;
        } catch (NonUniqueResultException nue) {
            GestorTipoObraBean.log4j(nue);
            return true;
        } catch (IllegalStateException ie) {
            GestorTipoObraBean.log4j(ie);
            return true;
        }

    }

    /***
     * Valida que el nombre de la nueva instancia de TipoObra, no coincida con otra en la BD.
     * @param tipoObra
     * @return true si existe alguna instancia TipoObra con nombre = "nombre" y ID <> "id"
     * y false en caso contrario
     * interfaz local
     */
    public boolean existeNombreTipoObraModificar(TipoObra tipoObra) {
        try {
            javax.persistence.Query q = em.createNamedQuery("TipoObra.findByNombreModificar");
            q.setParameter("nombre", tipoObra.getNombre().toUpperCase());
            q.setParameter("id", tipoObra.getId());
            if (q.getSingleResult() != null) {
                return true;
            } else {
                return false;
            }
        } catch (NoResultException ne) {
            GestorTipoObraBean.log4j(ne);
            return false;
        } catch (NonUniqueResultException nue) {
            GestorTipoObraBean.log4j(nue);
            return true;
        } catch (IllegalStateException ie) {
            GestorTipoObraBean.log4j(ie);
            return true;
        }
    }

    /***
     * Valida que el nombre de la nueva instancia de TipoObra, no coincida con otra en la BD.
     * @param tipoObra
     * @return true si existe alguna instancia TipoObra con nombre = "nombre" y ID <> "id"
     * y false en caso contrario
     * interfaz remota
     */
    public boolean existeNombreTipoObraModificarRemote(TipoObra tipoObra) {
        try {
            javax.persistence.Query q = em.createNamedQuery("TipoObra.findByNombreModificar");
            q.setParameter("nombre", tipoObra.getNombre().toUpperCase());
            q.setParameter("id", tipoObra.getId());
            if (q.getSingleResult() != null) {
                return true;
            } else {
                return false;
            }
        } catch (NoResultException ne) {
            GestorTipoObraBean.log4j(ne);
            return false;
        } catch (NonUniqueResultException nue) {
            GestorTipoObraBean.log4j(nue);
            return true;
        } catch (IllegalStateException ie) {
            GestorTipoObraBean.log4j(ie);
            return true;
        }

    }

    /***
     * Agrega una nueva instancia de tipo SubtipoObra, en la BD.
     * @param nombreSubtipo
     * @param descripcionSubtipo
     * @param idTipo
     * @return true si existe alguna instancia TipoObra con ID = idTipo, modificados y actualizados todos
     * sus atributos y relaciones con clases. Flase en caso contrario
     * interfaz local
     */
    public boolean agregarSubtipoObra(String nombreSubtipo, String descripcionSubtipo, int idTipo) {
        try {
            TipoObra to = em.find(datos.TipoObra.class, idTipo);
            datos.SubtipoObra sub = new datos.SubtipoObra();
            sub.setDescripcion(descripcionSubtipo.toUpperCase());
            sub.setNombre(nombreSubtipo.toUpperCase());
            sub.setIdTipoObra(to);
            persist(sub);
            to.getSubtipoObraCollection().add(sub);
            persist(to);
            em.flush();
            return true;
        } catch (Exception e) {
            GestorTipoObraBean.log4j(e);
            return false;
        }
    }

    /***
     * Agrega una nueva instancia de tipo SubtipoObra, en la BD.
     * @param nombreSubtipo
     * @param descripcionSubtipo
     * @param idTipo
     * @return true si existe alguna instancia TipoObra con ID = idTipo, modificados y actualizados todos
     * sus atributos y relaciones con clases. False en caso contrario
     * interfaz remota
     */
    public boolean agregarSubtipoObraRemote(String nombreSubtipo, String descripcionSubtipo, int idTipo) {
        try {
            TipoObra to = em.find(datos.TipoObra.class, idTipo);
            datos.SubtipoObra sub = new datos.SubtipoObra();
            sub.setDescripcion(descripcionSubtipo.toUpperCase());
            sub.setNombre(nombreSubtipo.toUpperCase());
            sub.setIdTipoObra(to);
            persist(sub);
            to.getSubtipoObraCollection().add(sub);
            persist(to);
            em.flush();
            return true;
        } catch (Exception e) {
            GestorTipoObraBean.log4j(e);
            return false;
        }
    }

    /***
     * Actualiza una instacia de tipo SubtipoObra.
     * @param idSubtipo
     * @param nombreSubtipo
     * @param descripcionSubtipo
     * @return true si existe alguna instancia SubtipoObra con ID = idSubtipo, modificados y actualizados todos
     * sus atributos y relaciones con clases. False en caso contrario
     * interfaz local
     */
    public boolean modificarSubtipoObra(int idSubtipo, String nombreSubtipo, String descripcionSubtipo) {
        try {
            datos.SubtipoObra su = em.find(datos.SubtipoObra.class, idSubtipo);
            su.setDescripcion(descripcionSubtipo.toUpperCase());
            su.setNombre(nombreSubtipo.toUpperCase());
            persist(su);
            return true;
        } catch (Exception e) {
            GestorTipoObraBean.log4j(e);
            return false;
        }
    }

    /***
     * Actualiza una instacia de tipo SubtipoObra.
     * @param idSubtipo
     * @param nombreSubtipo
     * @param descripcionSubtipo
     * @return true si existe alguna instancia SubtipoObra con ID = idSubtipo, modificados y actualizados todos
     * sus atributos y relaciones con clases. False en caso contrario
     * interfaz remota
     */
    public boolean modificarSubtipoObraRemote(int idSubtipo, String nombreSubtipo, String descripcionSubtipo) {
        try {
            datos.SubtipoObra su = em.find(datos.SubtipoObra.class, idSubtipo);
            su.setDescripcion(descripcionSubtipo.toUpperCase());
            su.setNombre(nombreSubtipo.toUpperCase());
            persist(su);
            return true;
        } catch (Exception e) {
            GestorTipoObraBean.log4j(e);
            return false;
        }
    }

    /***
     * Remueve una instancia de SubtipoObra de la BD.
     * @param idSubtipo
     * @return true si existe alguna instancia SubtipoObra con ID = idSubtipo, y removido todos
     * sus atributos y relaciones con clases. False en caso contrario
     * interfaz local
     */
    public boolean eliminarSubtipoObra(int idSubtipo) {
        try {
            datos.SubtipoObra su = em.find(datos.SubtipoObra.class, idSubtipo);
            em.remove(su);
            return true;
        } catch (Exception e) {
            GestorTipoObraBean.log4j(e);
            return false;
        }
    }

    /***
     * Remueve una instancia de SubtipoObra de la BD.
     * @param idSubtipo
     * @return true si existe alguna instancia SubtipoObra con ID = idSubtipo, y removido todos
     * sus atributos y relaciones con clases. False en caso contrario
     * interfaz remota
     */
    public boolean eliminarSubtipoObraRemote(int idSubtipo) {
        try {
            datos.SubtipoObra su = em.find(datos.SubtipoObra.class, idSubtipo);
            em.remove(su);
            return true;
        } catch (Exception e) {
            GestorTipoObraBean.log4j(e);
            return false;
        }
    }

    /***
     * Valida si ya existe alguna instancia de tipo SubtipoObra, con nombre y idTipo igual
     * al valor de los parametros nombre y idTipo respectivamente. Para no almacenar dos instancias con valores iguales.
     * @param idTipo
     * @param nombre
     * @return true si existe alguna instancia de SubtipoObra con nombre = "nombre"
     * y idTipoObra = "idTipo". False en caso contrario
     * interfaz local
     */
    public boolean existeNombreSubtipoObra(int idTipo, String nombre) {
        try {
            javax.persistence.Query q = em.createNamedQuery("SubtipoObra.existeNombreSubtipoEnTipo");
            q.setParameter("idTipo", idTipo);
            q.setParameter("nombre", nombre.toUpperCase());
            if (q.getSingleResult() != null) {
                return true;
            } else {
                return false;
            }
        } catch (NoResultException ne) {
            GestorTipoObraBean.log4j(ne);
            return false;
        } catch (NonUniqueResultException nue) {
            GestorTipoObraBean.log4j(nue);
            return true;
        } catch (IllegalStateException ie) {
            GestorTipoObraBean.log4j(ie);
            return true;
        }

    }

    /***
     * Valida si ya existe alguna instancia de tipo SubtipoObra, con nombre y idTipo igual
     * al valor de los parametros nombre y idTipo respectivamente. Para no almacenar dos instancias con valores iguales.
     * @param idTipo
     * @param nombre
     * @return true si existe alguna instancia de SubtipoObra con nombre = "nombre"
     * y idTipoObra = "idTipo". False en caso contrario
     * interfaz remota
     */
    public boolean existeNombreSubtipoObraRemote(int idTipo, String nombre) {
        try {
            javax.persistence.Query q = em.createNamedQuery("SubtipoObra.existeNombreSubtipoEnTipo");
            q.setParameter("idTipo", idTipo);
            q.setParameter("nombre", nombre.toUpperCase());
            if (q.getSingleResult() != null) {
                return true;
            } else {
                return false;
            }
        } catch (NoResultException ne) {
            GestorTipoObraBean.log4j(ne);
            return false;
        } catch (NonUniqueResultException nue) {
            GestorTipoObraBean.log4j(nue);
            return true;
        } catch (IllegalStateException ie) {
            GestorTipoObraBean.log4j(ie);
            return true;
        }

    }

    /***
     * Valida si ya existe alguna instancia de tipo SubtipoObra, con nombre y idTipo igual
     * al valor de los parametros nombre y idTipo respectivamente. Para no actualizar dos instancias con valores iguales.
     * @param idTipo
     * @param nombre
     * @param idSubtipo
     * @return true si existe alguna instancia de SubtipoObra con nombre = "nombre", idTipoObra = "idTipo"
     * y id <> "idSubtipo". False en caso contrario.
     * interfaz local
     */
    public boolean existeNombreSubtipoObraModificar(int idTipo, String nombre, int idSubtipo) {
        try {
            javax.persistence.Query q = em.createNamedQuery("SubtipoObra.existeNombreSubtipoEnTipoModificar");
            q.setParameter("nombre", nombre.toUpperCase());
            q.setParameter("idTipo", idTipo);
            q.setParameter("idSubtipo", idSubtipo);
            if (q.getSingleResult() != null) {
                return true;
            } else {
                return false;
            }
        } catch (NoResultException ne) {
            GestorTipoObraBean.log4j(ne);
            return false;
        } catch (NonUniqueResultException nue) {
            GestorTipoObraBean.log4j(nue);
            return true;
        } catch (IllegalStateException ie) {
            GestorTipoObraBean.log4j(ie);
            return true;
        }

    }

    /***
     * Valida si ya existe alguna instancia de tipo SubtipoObra, con nombre y idTipo igual
     * al valor de los parametros nombre y idTipo respectivamente. Para no actualizar dos instancias con valores iguales.
     * @param idTipo
     * @param nombre
     * @param idSubtipo
     * @return true si existe alguna instancia de SubtipoObra con nombre = "nombre", idTipoObra = "idTipo"
     * y id <> "idSubtipo". False en caso contrario.
     * interfaz remota
     */
    public boolean existeNombreSubtipoObraModificarRemote(int idTipo, String nombre, int idSubtipo) {
        try {
            javax.persistence.Query q = em.createNamedQuery("SubtipoObra.existeNombreSubtipoEnTipoModificar");
            q.setParameter("nombre", nombre.toUpperCase());
            q.setParameter("idTipo", idTipo);
            q.setParameter("idSubtipo", idSubtipo);
            if (q.getSingleResult() != null) {
                return true;
            } else {
                return false;
            }
        } catch (NoResultException ne) {
            GestorTipoObraBean.log4j(ne);
            return false;
        } catch (NonUniqueResultException nue) {
            GestorTipoObraBean.log4j(nue);
            return true;
        } catch (IllegalStateException ie) {
            GestorTipoObraBean.log4j(ie);
            return true;
        }

    }

    /***
     * Valida si alguna instancia de Obra tiene asignado una instancia TipoObra con ID igual
     * al valor del parametro idTipoObra.
     * @param idTipoObra
     * @return true si existe alguna instancia de Obra con idTipoObra = "idTipoObra", es decir,
     * relacionada con algún TipoObra y false en caso contrario
     * interfaz local
     */
    public boolean tipoObraFueAsignadoObras(int idTipoObra) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Obra.tipoObraTieneObras");
            q.setParameter("idTipoObra", idTipoObra);
            if (q.getResultList() != null) {
                if (q.getResultList().size() > 0) {
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }

        } catch (Exception e) {
            GestorTipoObraBean.log4j(e);
            return false;
        }
    }

    /***
     * Valida si alguna instancia de Obra tiene asignado una instancia TipoObra con ID igual
     * al valor del parametro idTipoObra.
     * @param idTipoObra
     * @return true si existe alguna instancia de Obra con idTipoObra = "idTipoObra", es decir,
     * relacionada con algún TipoObra y false en caso contrario
     * interfaz remota
     */
    public boolean tipoObraFueAsignadoObrasRemote(int idTipoObra) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Obra.tipoObraTieneObras");
            q.setParameter("idTipoObra", idTipoObra);
            if (q.getResultList() != null) {
                if (q.getResultList().size() > 0) {
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }

        } catch (Exception e) {
            GestorTipoObraBean.log4j(e);
            return false;
        }
    }

    /***
     * Retorna todas las instancias de SubtipoObra por Tipo.
     * @param idTipoObra
     * @return lista con todas las instancias de SubtipoObra con idTipoObra = "idTipoObra"
     * ordenada por nombre y null en caso contrario
     * interfaz local
     */
    public List subTiposObra(int idTipoObra) {
        try {
            javax.persistence.Query q = em.createNamedQuery("SubtipoObra.filtrarSubTiposPorTipo");
            q.setParameter("idTipoObra", idTipoObra);
            return q.getResultList();

        } catch (Exception e) {
            GestorTipoObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna todas las instancias de SubtipoObra por Tipo.
     * @param idTipoObra
     * @return lista con todas las instancias de SubtipoObra con idTipoObra = "idTipoObra"
     * ordenada por nombre y null en caso contrario
     * interfaz remota
     */
    public List subTiposObraRemote(int idTipoObra) {
        try {
            javax.persistence.Query q = em.createNamedQuery("SubtipoObra.filtrarSubTiposPorTipo");
            q.setParameter("idTipoObra", idTipoObra);
            return q.getResultList();

        } catch (Exception e) {
            GestorTipoObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna todas las instancias de SubtipoObra con nombre igual al valor de
     * parametro nombreSubtipo.
     * @param nombreSubtipo
     * @return lista de todas la instancias de SubtipoObra con nombre como nombreSubtipo
     * ordena por nombre y null en caso contrario
     * interfaz local
     */
    public List encontrarSubtiposPorNombre(String nombreSubtipo) {
        try {
            javax.persistence.Query q = em.createNamedQuery("SubtipoObra.findByNombre");
            q.setParameter("nombre", nombreSubtipo);
            return q.getResultList();

        } catch (Exception e) {
            GestorTipoObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna todas las instancias de SubtipoObra con nombre igual al valor de
     * parametro nombreSubtipo.
     * @param nombreSubtipo
     * @return lista de todas la instancias de SubtipoObra con nombre como nombreSubtipo
     * ordena por nombre y null en caso contrario
     * interfaz remota
     */
    public List encontrarSubtiposPorNombreRemote(String nombreSubtipo) {
        try {
            javax.persistence.Query q = em.createNamedQuery("SubtipoObra.findByNombre");
            q.setParameter("nombre", nombreSubtipo);
            return q.getResultList();

        } catch (Exception e) {
            GestorTipoObraBean.log4j(e);
            return null;
        }
    }
}
